package com.rainszj.controller.admin;

import com.rainszj.service.UserService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

/**
 * @author rainszj
 * 2020/3/10
 */
@Controller
public class LoginController {

    @Autowired
    UserService userService;


    /**
     * 跳转后台登录页面
     *
     * @return
     */
    @GetMapping("/login")
    public String toLogin() {


        return "admin/login";
    }


    /**
     * 跳转到后台首页
     *
     * @return
     */
    @GetMapping({"/admin/index", "/admin"})
    public String index() {
        return "admin/index";
    }

    /**
     * 处理登录请求
     *
     * @param username
     * @param password
     * @return
     */
    @PostMapping("/login")
    public String login(@RequestParam("username") String username,
                        @RequestParam("password") String password,
                        boolean rememberMe,
                        RedirectAttributes attributes) {

        // 获取当前的用户
        Subject subject = SecurityUtils.getSubject();
        // 封装用户登录的数据
        UsernamePasswordToken token = new UsernamePasswordToken(username, password, rememberMe);

        try {
            // 执行登录的方法，如果没有异常说明就 OK！
            subject.login(token);
            // 如果是转发的话，再次刷新页面，会弹出重新提交表单的提示框，这里交给Shiro来重定向了
            // return "/admin/index";
            //token.clear();
            return "redirect:/admin/index";
        } catch (UnknownAccountException e) {  // 用户名不存在
            // 这里不能使用 model，留待解决！！！
            attributes.addFlashAttribute("msg", "用户名错误");

            return "redirect:/login";
        } catch (IncorrectCredentialsException e) {  // 密码不存在
            attributes.addFlashAttribute("msg", "密码错误");

            return "redirect:/login";
        }

    }


    /**
     * 登出
     */
    @GetMapping("/logout")
    public String logout() {
        Subject currentSubject = SecurityUtils.getSubject();
        currentSubject.logout();
        return "redirect:/login";
    }

}
